package teste.objetos;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import junit.framework.Assert;
import objetos.*;

import org.junit.Before;
import org.junit.Test;

public class TestUsario {

	private Usuario usuarioTesteUm;
	private Usuario usuarioTesteDois;
	private Usuario usuarioTesteTres;
	private Item itemUm;
	private Item itemDois;
	private Item itemTres;
	private List<Item> verificaListaDeItens;
	private List<Usuario> verificaListaDeAmigosAdicionados;
	private List<Usuario> verificaListaDeAmigosPendentes;
	private Random random;
	
	@Before
	public void setUp() throws Exception {
		this.usuarioTesteUm = new Usuario("Usuariotst1", "UsuarioUm", "Endereco1");
		this.usuarioTesteDois = new Usuario("Usuariotst2", "UsuarioDois", "Endereco2");
		this.usuarioTesteTres = new Usuario("Usuariotst3", "UsuarioTres", "Endereco3");
		this.itemUm = new Item(this.usuarioTesteUm, "ItemUm", "ItemUm", "Jogo", 1);
		this.itemDois = new Item(this.usuarioTesteUm, "ItemDois", "ItemDois", "Jogo", 2);
		this.itemTres = new Item(this.usuarioTesteUm, "ItemTres", "ItemTres", "Jogo", 3);
		new Mensagem(this.usuarioTesteUm, this.usuarioTesteDois, this.itemUm);
		new Mensagem(this.usuarioTesteUm, this.usuarioTesteTres, this.itemDois);
		new Mensagem(this.usuarioTesteUm, this.usuarioTesteDois, this.itemTres);
		this.verificaListaDeItens = new ArrayList<Item>();
		new ArrayList<Mensagem>();
		this.verificaListaDeAmigosAdicionados = new ArrayList<Usuario>();
		this.verificaListaDeAmigosPendentes = new ArrayList<Usuario>();
		this.random = new Random();
	}

	@Test
	public void verificaConstrutor() {
		try{
			new Usuario("", "Nome", "Endereco");
			Assert.fail("Login vazio(String vazia)!");
		}
		catch (Exception e){
			Assert.assertEquals("Login vazio!", "Login inválido", e.getMessage());
		}
		
		try{
			new Usuario(null, "Nome", "Endereco");
			Assert.fail("Login nulo!");
		}
		catch (Exception e){
			Assert.assertEquals("Login nulo!", "Login inválido", e.getMessage());
		}
		
		try{
			new Usuario("Login", "", "Endereco");
			Assert.fail("Nome vazio(String vazia)!");
		}
		catch (Exception e){
			Assert.assertEquals("Nome vazio!", "Nome inválido", e.getMessage());
		}
		
		try{
			new Usuario("Login", null, "Endereco");
			Assert.fail("Nome nulo!");
		}
		catch (Exception e){
			Assert.assertEquals("Nome nulo!", "Nome inválido", e.getMessage());
		}
	}
	
	@Test
	public void verificaGetSetLogin() throws Exception{
		Assert.assertEquals("Usuariotst1", this.usuarioTesteUm.getLogin());
		this.usuarioTesteUm.setLogin("Usuariot1");
		Assert.assertEquals("Usuariot1", this.usuarioTesteUm.getLogin());
		
		Assert.assertEquals("Usuariotst2", this.usuarioTesteDois.getLogin());
		this.usuarioTesteDois.setLogin("Usuariot2");
		Assert.assertEquals("Usuariot2", this.usuarioTesteDois.getLogin());
		
		Assert.assertEquals("Usuariotst3", this.usuarioTesteTres.getLogin());
		this.usuarioTesteTres.setLogin("Usuariot3");
		Assert.assertEquals("Usuariot3", this.usuarioTesteTres.getLogin());
		
		try{
			this.usuarioTesteUm.setLogin("");
			Assert.fail("Login vazio(String vazia)!");
		}
		catch (Exception e){
			Assert.assertEquals("Login vazio!", "O login não poder ser vazio.", e.getMessage());
		}
	}
	
	@Test
	public void verificaGetSetNome() throws Exception{
		Assert.assertEquals("UsuarioUm", this.usuarioTesteUm.getNome());
		this.usuarioTesteUm.setNome("UsuarioTesteUm");
		Assert.assertEquals("UsuarioTesteUm", this.usuarioTesteUm.getNome());
		
		Assert.assertEquals("UsuarioDois", this.usuarioTesteDois.getNome());
		this.usuarioTesteDois.setNome("UsuarioTesteDois");
		Assert.assertEquals("UsuarioTesteDois", this.usuarioTesteDois.getNome());
		
		Assert.assertEquals("UsuarioTres", this.usuarioTesteTres.getNome());
		this.usuarioTesteTres.setNome("UsuarioTesteTres");
		Assert.assertEquals("UsuarioTesteTres", this.usuarioTesteTres.getNome());
		
		try{
			this.usuarioTesteUm.setNome("");
			Assert.fail("Nome vazio(String vazia)!");
		}
		catch (Exception e){
			Assert.assertEquals("Nome vazio!", "O nome não deve ser vazio", e.getMessage());
		}
	}
	
	@Test
	public void verificaGetSetEndereco(){
		Assert.assertEquals("Endereco1", this.usuarioTesteUm.getEndereco());
		this.usuarioTesteUm.setEndereco("NovoEnderecoUm");
		Assert.assertEquals("NovoEnderecoUm", this.usuarioTesteUm.getEndereco());
		
		Assert.assertEquals("Endereco2", this.usuarioTesteDois.getEndereco());
		this.usuarioTesteDois.setEndereco("NovoEnderecoDois");
		Assert.assertEquals("NovoEnderecoDois", this.usuarioTesteDois.getEndereco());
		
		Assert.assertEquals("Endereco3", this.usuarioTesteTres.getEndereco());
		this.usuarioTesteTres.setEndereco("NovoEnderecoTres");
		Assert.assertEquals("NovoEnderecoTres", this.usuarioTesteTres.getEndereco());
		
	}
	
	@Test
	public void verificaGetSetEmail() throws Exception{
		this.usuarioTesteUm.setEmail("usuarioum@teste.com");
		Assert.assertEquals("usuarioum@teste.com", this.usuarioTesteUm.getEmail());
		
		this.usuarioTesteDois.setEmail("usuariodois@teste.com");
		Assert.assertEquals("usuariodois@teste.com", this.usuarioTesteDois.getEmail());

		this.usuarioTesteTres.setEmail("usuariotres@teste.com");
		Assert.assertEquals("usuariotres@teste.com", this.usuarioTesteTres.getEmail());
		
		try{
			this.usuarioTesteUm.setEmail("");
			Assert.fail("Email vazio(String vazia)!");
		}
		catch (Exception e){
			Assert.assertEquals("Email vazio!", "O email deve conter @ e ser maior que 3", e.getMessage());
		}
		
	}
	
	@Test
	public void verificaGetSetListaDeItens() throws Exception{

		this.verificaListaDeItens.add(itemUm);
		this.usuarioTesteUm.setItens(itemUm);
		Assert.assertEquals(verificaListaDeItens, this.usuarioTesteUm.getListaDeItens());
		
		this.verificaListaDeItens.add(itemDois);
		this.usuarioTesteUm.setItens(itemDois);
		Assert.assertEquals(verificaListaDeItens, this.usuarioTesteUm.getListaDeItens());
		
		this.verificaListaDeItens.add(itemTres);
		this.usuarioTesteUm.setItens(itemTres);
		Assert.assertEquals(verificaListaDeItens, this.usuarioTesteUm.getListaDeItens());
		
	}
	
	
	@Test
	public void verificaGetSetAmigosAdicionados() throws Exception{
		
		this.verificaListaDeAmigosAdicionados.add(this.usuarioTesteDois);
		this.usuarioTesteUm.aprovarAmizade(this.usuarioTesteDois);
		Assert.assertEquals(this.verificaListaDeAmigosAdicionados, this.usuarioTesteUm.getListaDeAmigosAdicionados());
		
		this.verificaListaDeAmigosAdicionados.add(this.usuarioTesteTres);
		this.usuarioTesteUm.aprovarAmizade(this.usuarioTesteTres);
		Assert.assertEquals(this.verificaListaDeAmigosAdicionados, this.usuarioTesteUm.getListaDeAmigosAdicionados());
		
	}
	
	@Test
	public void verificaGetSetAmigosPendentes() throws Exception{
		
		this.verificaListaDeAmigosPendentes.add(this.usuarioTesteDois);
		this.usuarioTesteUm.adicionarAmizadePendente(this.usuarioTesteDois);
		Assert.assertEquals(this.verificaListaDeAmigosPendentes, this.usuarioTesteUm.getListaDeAmigosPendentes());
		
		this.verificaListaDeAmigosPendentes.add(this.usuarioTesteTres);
		this.usuarioTesteUm.adicionarAmizadePendente(this.usuarioTesteTres);
		Assert.assertEquals(this.verificaListaDeAmigosPendentes, this.usuarioTesteUm.getListaDeAmigosPendentes());
		
	}
	
	@Test
	public void verificaNumeroDeEmprestimos(){
		Assert.assertEquals(0, this.usuarioTesteUm.getNumeroDeEmprestimosRealizados());
		Assert.assertEquals(0, this.usuarioTesteDois.getNumeroDeEmprestimosRealizados());
		Assert.assertEquals(0, this.usuarioTesteTres.getNumeroDeEmprestimosRealizados());
		
		for (int index = 0; index < random.nextInt(1000); index++){
			this.usuarioTesteUm.adicionaEmprestimoRealizado();
			Assert.assertEquals((index + 1), this.usuarioTesteUm.getNumeroDeEmprestimosRealizados());
		}
		
		for (int index = 0; index < random.nextInt(1000); index++){
			this.usuarioTesteDois.adicionaEmprestimoRealizado();
			Assert.assertEquals((index + 1), this.usuarioTesteDois.getNumeroDeEmprestimosRealizados());
		}
		
		for (int index = 0; index < random.nextInt(1000); index++){
			this.usuarioTesteTres.adicionaEmprestimoRealizado();
			Assert.assertEquals((index + 1), this.usuarioTesteTres.getNumeroDeEmprestimosRealizados());
		}
		
	}
	
	@Test
	public void verificaGetSetSenha(){
		this.usuarioTesteUm.setSenha("SenhaUm");
		Assert.assertEquals("SenhaUm", this.usuarioTesteUm.getSenha());
		
		this.usuarioTesteDois.setSenha("SenhaDois");
		Assert.assertEquals("SenhaDois", this.usuarioTesteDois.getSenha());
		
		this.usuarioTesteTres.setSenha("SenhaTres");
		Assert.assertEquals("SenhaTres", this.usuarioTesteTres.getSenha());
		
	}
	
	@Test
	public void verificaEquals(){
		Assert.assertEquals(false, this.usuarioTesteUm.equals(null));
		Assert.assertEquals(false, this.usuarioTesteUm.equals(""));
		Assert.assertEquals(true, this.usuarioTesteUm.equals(this.usuarioTesteUm));
		Assert.assertEquals(true, this.usuarioTesteDois.equals(this.usuarioTesteDois));
		Assert.assertEquals(true, this.usuarioTesteTres.equals(this.usuarioTesteTres));
		Assert.assertEquals(false, this.usuarioTesteUm.equals(this.usuarioTesteDois));
		Assert.assertEquals(false, this.usuarioTesteUm.equals(this.usuarioTesteTres));
		Assert.assertEquals(false, this.usuarioTesteDois.equals(this.usuarioTesteTres));
		
	}

}
